<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Variadic function</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Variadic_function"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Variadic_function rootpage-Variadic_function skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Variadic function</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">"Varargs" redirects here. For the varargs.h library in C, see <a href="Varargs.h" class="mw-redirect" title="Varargs.h">varargs.h</a>.</div>
<p>In <a href="Mathematics" title="Mathematics">mathematics</a> and in <a href="Computer_programming" title="Computer programming">computer programming</a>, a <b>variadic function</b> is a <a href="Function_(programming)" class="mw-redirect" title="Function (programming)">function</a> of indefinite <a href="Arity" title="Arity">arity</a>, i.e., one which accepts a variable number of <a href="Argument_(computer_science)" class="mw-redirect" title="Argument (computer science)">arguments</a>. Support for variadic functions differs widely among <a href="Programming_language" title="Programming language">programming languages</a>.
</p><p>The term <i>variadic</i> is a <a href="Neologism" title="Neologism">neologism</a>, dating back to 1936/1937.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> The term was not widely used until the 1970s.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Overview">Overview</h2></div>
<p>There are many mathematical and logical operations that come across naturally as variadic functions. For instance, the summing of numbers or the <a href="Concatenation" title="Concatenation">concatenation</a> of strings or other sequences are operations that can be thought of as applicable to any number of operands (even though formally in these cases the <a href="Associative_property" title="Associative property">associative property</a> is applied).
</p><p>Another operation that has been implemented as a variadic function in many languages is output formatting. The <a href="C_(programming_language)" title="C (programming language)">C</a> function <a href="Printf" title="Printf"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">printf</code></a> and the <a href="Common_Lisp" title="Common Lisp">Common Lisp</a> function <a href="Format_(Common_Lisp)" title="Format (Common Lisp)"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">format</code></a> are two such examples. Both take one argument that specifies the formatting of the output, and <i>any number</i> of arguments that provide the values to be formatted.
</p><p>Variadic functions can expose <a href="Type_safety" title="Type safety">type-safety</a> problems in some languages. For instance, C's <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">printf</code>, if used incautiously, can give rise to a class of security holes known as <a href="Format_string_attack" class="mw-redirect" title="Format string attack">format string attacks</a>. The attack is possible because the language support for variadic functions is not type-safe: it permits the function to attempt to pop more arguments off the <a href="Stack_(abstract_data_type)#Hardware_stacks" title="Stack (abstract data type)">stack</a> than were placed there, corrupting the stack and leading to unexpected behavior. As a consequence of this, the <a href="CERT_Coordination_Center" title="CERT Coordination Center">CERT Coordination Center</a> considers variadic functions in C to be a high-severity security risk.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>In <a href="Functional_programming" title="Functional programming">functional programming</a> languages, variadics can be considered complementary to the <a href="Apply" title="Apply">apply</a> function, which takes a function and a list/sequence/array as arguments, and calls the function with the arguments supplied in that list, thus passing a variable number of arguments to the function. In the functional language <a href="Haskell" title="Haskell">Haskell</a>, variadic functions can be implemented by returning a value of a <a href="Type_class" title="Type class">type class</a> <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">T</code>; if instances of <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">T</code> are a final return value <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">r</code> and a function <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">(T t) => x -> t</code>, this allows for any number of additional arguments <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">x</code>.
</p><p>A related subject in <a href="Term_rewriting" class="mw-redirect" title="Term rewriting">term rewriting</a> research is called <b>hedges</b>, or <b>hedge variables</b>.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Unlike variadics, which are functions with arguments, hedges are sequences of arguments themselves. They also can have constraints ('take no more than 4 arguments', for example) to the point where they are not variable-length (such as 'take exactly 4 arguments') - thus calling them <i>variadics</i> can be misleading. However they are referring to the same phenomenon, and sometimes the phrasing is mixed, resulting in names such as <i>variadic variable</i> (synonymous to hedge). Note the double meaning of the word <i>variable</i> and the difference between arguments and variables in functional programming and term rewriting. For example, a term (function) can have three variables, one of them a hedge, thus allowing the term to take three or more arguments (or two or more if the hedge is allowed to be empty).
</p>
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<div class="mw-heading mw-heading3"><h3 id="In_C">In C</h3></div>
<p>To portably implement variadic functions in the <a href="C_(programming_language)" title="C (programming language)">C language</a>, the standard <a href="Stdarg.h" title="Stdarg.h"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">stdarg.h</code></a> header file is used. The older <a href="Varargs.h" class="mw-redirect" title="Varargs.h"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">varargs.h</code></a> header has been <a href="Deprecation" title="Deprecation">deprecated</a> in favor of <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">stdarg.h</code>. In C++, the header file <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">cstdarg</code> is used.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdarg.h></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span>
<span class="kt">double</span><span class="w"> </span><span class="nf">average</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">va_list</span><span class="w"> </span><span class="n">ap</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">j</span><span class="p">;</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="n">va_start</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="n">count</span><span class="p">);</span><span class="w"> </span><span class="cm">/* Before C23: Requires the last fixed parameter (to get the address) */</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">count</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">);</span><span class="w"> </span><span class="cm">/* Increments ap to the next argument. */</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">va_end</span><span class="p">(</span><span class="n">ap</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">count</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="o">*</span><span class="n">argv</span><span class="p">[])</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">average</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">));</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>This will compute the average of an arbitrary number of arguments. Note that the function does not know the number of arguments or their types. The above function expects that the types will be <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">int</code>, and that the number of arguments is passed in the first argument (this is a frequent usage but by no means enforced by the language or compiler). In some other cases, for example <a href="Printf" title="Printf">printf</a>, the number and types of arguments are figured out from a format string. In both cases, this depends on the programmer to supply the correct information. (Alternatively, a <a href="Sentinel_value" title="Sentinel value">sentinel value</a> like <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">NULL</code> or <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">nullptr</code> may be used to indicate the end of the parameter list.) If fewer arguments are passed in than the function believes, or the types of arguments are incorrect, this could cause it to read into invalid areas of memory and can lead to vulnerabilities like the <a href="Format_string_attack" class="mw-redirect" title="Format string attack">format string attack</a>. Depending on the system, even using <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">NULL</code> as a sentinel may encounter such problems; <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">nullptr</code> or a dedicated null pointer of the correct target type may be used to avoid them.
</p><p><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">stdarg.h</code> declares a type, <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code>, and defines four macros: <a href="Va_start" class="mw-redirect" title="Va start"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_start</code></a>, <a href="Va_arg" class="mw-redirect" title="Va arg"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_arg</code></a>, <a href="Va_copy" class="mw-redirect" title="Va copy"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_copy</code></a>, and <a href="Va_end" class="mw-redirect" title="Va end"><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_end</code></a>. Each invocation of <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_start</code> and <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_copy</code> must be matched by a corresponding invocation of <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_end</code>. When working with variable arguments, a function normally declares a variable of type <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> (<code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">ap</code> in the example) that will be manipulated by the macros.
</p>
<ol><li><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_start</code> takes two arguments, a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> object and a reference to the function's last parameter (the one before the ellipsis; the macro uses this to get its bearings). In <a href="C23_(C_standard_revision)" title="C23 (C standard revision)">C23</a>, the second argument will no longer be required and variadic functions will no longer need a named parameter before the ellipsis.<sup id="cite_ref-KandR_6-0" class="reference"><a href="#cite_note-KandR-6"><span class="cite-bracket">[</span>note 1<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-N2975_7-0" class="reference"><a href="#cite_note-N2975-7"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> It initialises the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> object for use by <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_arg</code> or <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_copy</code>. The compiler will normally issue a warning if the reference is incorrect (e.g. a reference to a different parameter than the last one, or a reference to a wholly different object), but will not prevent compilation from completing normally.</li>
<li><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_arg</code> takes two arguments, a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> object (previously initialised) and a type descriptor. It expands to the next variable argument, and has the specified type. Successive invocations of <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_arg</code> allow processing each of the variable arguments in turn. Unspecified behavior occurs if the type is incorrect or there is no next variable argument.</li>
<li><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_end</code> takes one argument, a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> object. It serves to clean up. If one wanted to, for instance, scan the variable arguments more than once, the programmer would re-initialise your <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> object by invoking <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_end</code> and then <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_start</code> again on it.</li>
<li><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_copy</code> takes two arguments, both of them <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> objects. It clones the second (which must have been initialised) into the first. Going back to the "scan the variable arguments more than once" example, this could be achieved by invoking <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_start</code> on a first <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code>, then using <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_copy</code> to clone it into a second <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code>. After scanning the variable arguments a first time with <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_arg</code> and the first <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> (disposing of it with <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_end</code>), the programmer could scan the variable arguments a second time with <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_arg</code> and the second <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code>. <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_end</code> needs to also be called on the cloned <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">va_list</code> before the containing function returns.</li></ol>
<div class="mw-heading mw-heading3"><h3 id="In_C#">In C#</h3></div>
<p><a href="C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a> describes variadic functions using the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">params</code> keyword. A type must be provided for the arguments, although <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">object[]</code> can be used as a catch-all. At the calling site, you can either list the arguments one by one, or hand over a pre-existing array having the required element type. Using the variadic form is <a href="Syntactic_sugar" title="Syntactic sugar">Syntactic sugar</a> for the latter.
</p>
<div class="mw-highlight mw-highlight-lang-c# mw-content-ltr" dir="ltr"><pre><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Program</span>
<span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">Foo</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="k">params</span><span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span>
</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Return the sum of the integers in args, ignoring a and b.</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">args</span><span class="p">)</span>
<span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">sum</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">Foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">));</span><span class="w"> </span><span class="c1">// 0</span>
</span><span class="hll"><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">Foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"> </span><span class="mi">20</span><span class="p">));</span><span class="w"> </span><span class="c1">// 33</span>
</span><span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">manyValues</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">13</span><span class="p">,</span><span class="w"> </span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="p">};</span>
<span class="hll"><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">Foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">manyValues</span><span class="p">));</span><span class="w"> </span><span class="c1">// 42</span>
</span><span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_C++">In C++</h3></div>
<p>The basic variadic facility in C++ is largely identical to that in C. The only difference is in the syntax, where the comma before the ellipsis can be omitted. C++ allows variadic functions without <a href="Named_parameter" title="Named parameter">named parameters</a> but provides no way to access those arguments since <code>va_start</code> requires the name of the last fixed argument of the function.
</p>
<div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><cstdarg></span>
<span class="kt">void</span><span class="w"> </span><span class="nf">simple_printf</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="o">*</span><span class="w"> </span><span class="n">fmt</span><span class="p">...)</span><span class="w"> </span><span class="c1">// C-style "const char* fmt, ..." is also valid</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">va_list</span><span class="w"> </span><span class="n">args</span><span class="p">;</span>
<span class="w"> </span><span class="n">va_start</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="n">fmt</span><span class="p">);</span>
<span class="w"> </span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">fmt</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="sc">'\0'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">fmt</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="sc">'d'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="sc">'\n'</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">fmt</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="sc">'c'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// note automatic conversion to integral type</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="k">static_cast</span><span class="o"><</span><span class="kt">char</span><span class="o">></span><span class="p">(</span><span class="n">c</span><span class="p">)</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="sc">'\n'</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="n">fmt</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="sc">'f'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="sc">'\n'</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="o">++</span><span class="n">fmt</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="n">va_end</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">simple_printf</span><span class="p">(</span><span class="s">"dcff"</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="sc">'a'</span><span class="p">,</span><span class="w"> </span><span class="mf">1.999</span><span class="p">,</span><span class="w"> </span><span class="mf">42.5</span><span class="p">);</span><span class="w"> </span>
<span class="p">}</span>
</pre></div>
<p><a href="Variadic_templates" class="mw-redirect" title="Variadic templates">Variadic templates</a> (parameter pack) can also be used in C++ with language built-in <a href="Fold_(higher-order_function)" title="Fold (higher-order function)">fold expressions</a>.
</p>
<div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="k">template</span><span class="w"> </span><span class="o"><</span><span class="k">typename</span><span class="p">...</span><span class="w"> </span><span class="n">Ts</span><span class="o">></span>
<span class="kt">void</span><span class="w"> </span><span class="n">foo_print</span><span class="p">(</span><span class="n">Ts</span><span class="p">...</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span>
<span class="p">{</span>
<span class="w"> </span><span class="p">((</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">args</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="sc">' '</span><span class="p">),</span><span class="w"> </span><span class="p">...);</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">boolalpha</span><span class="p">;</span>
<span class="w"> </span><span class="n">foo_print</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mf">3.14f</span><span class="p">);</span><span class="w"> </span><span class="c1">// 1 3.14</span>
<span class="w"> </span><span class="n">foo_print</span><span class="p">(</span><span class="s">"Foo"</span><span class="p">,</span><span class="w"> </span><span class="sc">'b'</span><span class="p">,</span><span class="w"> </span><span class="nb">true</span><span class="p">,</span><span class="w"> </span><span class="k">nullptr</span><span class="p">);</span><span class="w"> </span><span class="c1">// Foo b true nullptr</span>
<span class="p">}</span>
</pre></div>
<p>The <a href="CERT_Coding_Standards" title="CERT Coding Standards">CERT Coding Standards</a> for C++ strongly prefers the use of <a href="Variadic_templates" class="mw-redirect" title="Variadic templates">variadic templates</a> (parameter pack) in C++ over the C-style variadic function due to a lower risk of misuse.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="In_Fortran">In Fortran</h3></div>
<p>Since the Fortran 90 revision, <a href="Fortran" title="Fortran">Fortran</a> functions or subroutines can accept optional arguments:<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> the argument list is still fixed, but the ones that have the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">optional</code> attribute can be omitted in the function/subroutine call. The intrinsic function <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">present()</code> can be used to detect the presence of an optional argument. The optional arguments can appear anywhere in the argument list.
</p>
<div class="mw-highlight mw-highlight-lang-fortran mw-content-ltr" dir="ltr"><pre><span class="k">program </span><span class="n">test</span>
<span class="k">implicit none</span>
<span class="k"> </span><span class="kt">real</span><span class="w"> </span><span class="kd">::</span><span class="w"> </span><span class="n">x</span>
<span class="w"> </span>
<span class="w"> </span><span class="c">!> all arguments are passed:</span>
<span class="w"> </span><span class="k">call </span><span class="n">foo</span><span class="p">(</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="c">!< outputs 1 \ 2 \ 3.0 \ 4 \ 6.0 (the "\" denotes a newline)</span>
<span class="w"> </span>
<span class="w"> </span><span class="c">!> the last 2 arguments are omitted:</span>
<span class="w"> </span><span class="k">call </span><span class="n">foo</span><span class="p">(</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mf">3.0</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="c">!< outputs 1 \ 2 \ 3.0</span>
<span class="w"> </span>
<span class="w"> </span><span class="c">!> the 2nd and 4th arguments are omitted: the arguments that are positioned after </span>
<span class="w"> </span><span class="c">!> an omitted argument must be passed with a keyword:</span>
<span class="w"> </span><span class="k">call </span><span class="n">foo</span><span class="p">(</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mf">3.0</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="o">=</span><span class="n">x</span><span class="w"> </span><span class="p">)</span><span class="w"> </span>
<span class="w"> </span><span class="c">!< outputs 1 \ 3.0 \ 6.0</span>
<span class="w"> </span>
<span class="w"> </span><span class="c">!> alternatively, the Fortran 2023 revision has introduced the .NIL. pseudo constant</span>
<span class="w"> </span><span class="c">!> to denote an omitted argument</span>
<span class="w"> </span><span class="k">call </span><span class="n">foo</span><span class="p">(</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p">.</span><span class="n">NIL</span><span class="p">.,</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span><span class="w"> </span><span class="p">.</span><span class="n">NIL</span><span class="p">.,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="c">!< outputs 1 \ 3.0 \ 6.0</span>
<span class="k">contains</span>
<span class="w"> </span><span class="c">!> the subroutine foo() has 2 mandatory and 3 optional arguments</span>
<span class="w"> </span><span class="k">subroutine </span><span class="n">foo</span><span class="p">(</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="p">)</span>
<span class="w"> </span><span class="kt">integer</span><span class="p">,</span><span class="w"> </span><span class="k">intent</span><span class="p">(</span><span class="n">in</span><span class="p">)</span><span class="w"> </span><span class="kd">::</span><span class="w"> </span><span class="n">a</span><span class="w"> </span>
<span class="w"> </span><span class="kt">integer</span><span class="p">,</span><span class="w"> </span><span class="k">intent</span><span class="p">(</span><span class="n">in</span><span class="p">),</span><span class="w"> </span><span class="k">optional</span><span class="w"> </span><span class="kd">::</span><span class="w"> </span><span class="n">b</span>
<span class="w"> </span><span class="kt">real</span><span class="p">,</span><span class="w"> </span><span class="k">intent</span><span class="p">(</span><span class="n">in</span><span class="p">)</span><span class="w"> </span><span class="kd">::</span><span class="w"> </span><span class="n">c</span>
<span class="w"> </span><span class="kt">integer</span><span class="p">,</span><span class="w"> </span><span class="k">intent</span><span class="p">(</span><span class="n">in</span><span class="p">),</span><span class="w"> </span><span class="k">optional</span><span class="w"> </span><span class="kd">::</span><span class="w"> </span><span class="n">d</span>
<span class="w"> </span><span class="kt">real</span><span class="p">,</span><span class="w"> </span><span class="k">intent</span><span class="p">(</span><span class="n">out</span><span class="p">),</span><span class="w"> </span><span class="k">optional</span><span class="w"> </span><span class="kd">::</span><span class="w"> </span><span class="n">e</span>
<span class="w"> </span>
<span class="w"> </span><span class="k">print</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="n">a</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nb">present</span><span class="p">(</span><span class="n">b</span><span class="p">))</span><span class="w"> </span><span class="k">print</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="w"> </span>
<span class="w"> </span><span class="k">print</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="n">c</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nb">present</span><span class="p">(</span><span class="n">d</span><span class="p">))</span><span class="w"> </span><span class="k">print</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="n">d</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nb">present</span><span class="p">(</span><span class="n">e</span><span class="p">))</span><span class="w"> </span><span class="k">then</span>
<span class="k"> </span><span class="n">e</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="o">*</span><span class="n">c</span>
<span class="w"> </span><span class="k">print</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="n">c</span>
<span class="w"> </span><span class="k">end if</span>
<span class="k"> end subroutine</span>
<span class="k">end program</span>
</pre></div>
<p><b>Output:</b>
</p>
<pre>The sum of [1 2] is 3
The sum of [1 2 3] is 6
The sum of [1 2 3 4] is 10
</pre>
<div class="mw-heading mw-heading3"><h3 id="In_Go">In Go</h3></div>
<p>Variadic functions in <a href="Go_(programming_language)" title="Go (programming language)">Go</a> can be called with any number of trailing arguments.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">fmt.Println</code> is a common variadic function; it uses an empty interface as a catch-all type.
</p>
<div class="mw-highlight mw-highlight-lang-go mw-content-ltr" dir="ltr"><pre><span class="kn">package</span><span class="w"> </span><span class="nx">main</span>
<span class="kn">import</span><span class="w"> </span><span class="s">"fmt"</span>
<span class="c1">// This variadic function takes an arbitrary number of ints as arguments.</span>
<span class="kd">func</span><span class="w"> </span><span class="nx">sum</span><span class="p">(</span><span class="nx">nums</span><span class="w"> </span><span class="o">...</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Print</span><span class="p">(</span><span class="s">"The sum of "</span><span class="p">,</span><span class="w"> </span><span class="nx">nums</span><span class="p">)</span><span class="w"> </span><span class="c1">// Also a variadic function.</span>
<span class="w"> </span><span class="nx">total</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">num</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">nums</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">total</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nx">num</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">" is"</span><span class="p">,</span><span class="w"> </span><span class="nx">total</span><span class="p">)</span><span class="w"> </span><span class="c1">// Also a variadic function.</span>
<span class="p">}</span>
<span class="kd">func</span><span class="w"> </span><span class="nx">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Variadic functions can be called in the usual way with individual</span>
<span class="w"> </span><span class="c1">// arguments.</span>
<span class="w"> </span><span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="c1">// "The sum of [1 2] is 3"</span>
<span class="w"> </span><span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="c1">// "The sum of [1 2 3] is 6"</span>
<span class="w"> </span><span class="c1">// If you already have multiple args in a slice, apply them to a variadic</span>
<span class="w"> </span><span class="c1">// function using func(slice...) like this.</span>
<span class="w"> </span><span class="nx">nums</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="p">[]</span><span class="kt">int</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">}</span>
<span class="w"> </span><span class="nx">sum</span><span class="p">(</span><span class="nx">nums</span><span class="o">...</span><span class="p">)</span><span class="w"> </span><span class="c1">// "The sum of [1 2 3 4] is 10"</span>
<span class="p">}</span>
</pre></div>
<p><b>Output:</b>
</p>
<pre>The sum of [1 2] is 3
The sum of [1 2 3] is 6
The sum of [1 2 3 4] is 10
</pre>
<div class="mw-heading mw-heading3"><h3 id="In_Java">In Java</h3></div>
<p>As with C#, the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">Object</code> type in <a href="Java_(programming_language)" title="Java (programming language)">Java</a> is available as a catch-all.
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Program</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Variadic methods store any additional arguments they receive in an array.</span>
<span class="w"> </span><span class="c1">// Consequentially, `printArgs` is actually a method with one parameter: a</span>
<span class="w"> </span><span class="c1">// variable-length array of `String`s.</span>
<span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">printArgs</span><span class="p">(</span><span class="n">String</span><span class="p">...</span><span class="w"> </span><span class="n">strings</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">strings</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">string</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">printArgs</span><span class="p">(</span><span class="s">"hello"</span><span class="p">);</span><span class="w"> </span><span class="c1">// short for printArgs(["hello"])</span>
<span class="w"> </span><span class="n">printArgs</span><span class="p">(</span><span class="s">"hello"</span><span class="p">,</span><span class="w"> </span><span class="s">"world"</span><span class="p">);</span><span class="w"> </span><span class="c1">// short for printArgs(["hello", "world"])</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_JavaScript">In JavaScript</h3></div>
<p><a href="JavaScript" title="JavaScript">JavaScript</a> does not care about types of variadic arguments.
</p>
<div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span class="kd">function</span><span class="w"> </span><span class="nx">sum</span><span class="p">(...</span><span class="nx">numbers</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">numbers</span><span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span><span class="w"> </span><span class="nx">b</span><span class="p">)</span><span class="w"> </span><span class="p">=></span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">b</span><span class="p">,</span><span class="w"> </span><span class="mf">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">,</span><span class="w"> </span><span class="mf">3</span><span class="p">));</span><span class="w"> </span><span class="c1">// 6</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mf">3</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">));</span><span class="w"> </span><span class="c1">// 5</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">());</span><span class="w"> </span><span class="c1">// 0</span>
</pre></div>
<p>It's also possible to create a variadic function using the arguments object, although it is only usable with functions created with the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">function</code> keyword.
</p>
<div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span class="kd">function</span><span class="w"> </span><span class="nx">sum</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">Array</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">reduce</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">arguments</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="w"> </span><span class="nx">b</span><span class="p">)</span><span class="w"> </span><span class="p">=></span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">b</span><span class="p">,</span><span class="w"> </span><span class="mf">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">,</span><span class="w"> </span><span class="mf">3</span><span class="p">));</span><span class="w"> </span><span class="c1">// 6</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">(</span><span class="mf">3</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">));</span><span class="w"> </span><span class="c1">// 5</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">());</span><span class="w"> </span><span class="c1">// 0</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Lua">In <a href="Lua_(programming_language)" class="mw-redirect" title="Lua (programming language)">Lua</a></h3></div>
<p><a href="Lua_(programming_language)" class="mw-redirect" title="Lua (programming language)">Lua</a> functions may pass varargs to other functions the same way as other values using the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">return</code> keyword. tables can be passed into variadic functions by using, in Lua version 5.2 or higher<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">table.unpack</code>, or Lua 5.1 or lower<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">unpack</code>. Varargs can be used as a table by constructing a table with the vararg as a value.</p><div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span class="kr">function</span><span class="w"> </span><span class="nf">sum</span><span class="p">(...)</span><span class="w"> </span><span class="c1">--... designates varargs</span>
<span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">sum</span><span class="o">=</span><span class="mi">0</span>
<span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="nv">_</span><span class="p">,</span><span class="nv">v</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">({...})</span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="c1">--creating a table with a varargs is the same as creating one with standard values</span>
<span class="w"> </span><span class="nv">sum</span><span class="o">=</span><span class="nv">sum</span><span class="o">+</span><span class="nv">v</span>
<span class="w"> </span><span class="kr">end</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nv">sum</span>
<span class="kr">end</span>
<span class="nv">values</span><span class="o">=</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">}</span>
<span class="nf">sum</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="nb">table.unpack</span><span class="p">(</span><span class="nv">values</span><span class="p">))</span><span class="w"> </span><span class="c1">--returns 15. table.unpack should go after any other arguments, otherwise not all values will be passed into the function.</span>
<span class="kr">function</span><span class="w"> </span><span class="nf">add5</span><span class="p">(...)</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="p">...</span><span class="o">+</span><span class="mi">5</span><span class="w"> </span><span class="c1">--this is incorrect usage of varargs, and will only return the first value provided</span>
<span class="kr">end</span>
<span class="nv">entries</span><span class="o">=</span><span class="p">{}</span>
<span class="kr">function</span><span class="w"> </span><span class="nf">process_entries</span><span class="p">()</span>
<span class="w"> </span><span class="kd">local</span><span class="w"> </span><span class="nv">processed</span><span class="o">=</span><span class="p">{}</span>
<span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="nv">i</span><span class="p">,</span><span class="nv">v</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nb">pairs</span><span class="p">(</span><span class="nv">entries</span><span class="p">)</span><span class="w"> </span><span class="kr">do</span>
<span class="w"> </span><span class="nv">processed</span><span class="p">[</span><span class="nv">i</span><span class="p">]</span><span class="o">=</span><span class="nv">v</span><span class="w"> </span><span class="c1">--placeholder processing code</span>
<span class="w"> </span><span class="kr">end</span>
<span class="w"> </span><span class="kr">return</span><span class="w"> </span><span class="nb">table.unpack</span><span class="p">(</span><span class="nv">processed</span><span class="p">)</span><span class="w"> </span><span class="c1">--returns all entries in a way that can be used as a vararg</span>
<span class="kr">end</span>
<span class="nb">print</span><span class="p">(</span><span class="nf">process_entries</span><span class="p">())</span><span class="w"> </span><span class="c1">--the print function takes all varargs and writes them to stdout separated by newlines</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Pascal">In Pascal</h3></div>
<p><a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a> is standardized by <a href="International_Organization_for_Standardization" title="International Organization for Standardization">ISO</a> standards 7185 (“Standard Pascal”) and 10206 (“Extended Pascal”).
Neither standardized form of Pascal supports variadic routines, <i>except</i> for certain <a href="Intrinsic_function" title="Intrinsic function">built-in routines</a> (<code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="nb">read</span></code>/<code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="nb">readLn</span></code> and <code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="nb">write</span></code>/<code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="nb">writeLn</span></code>, and additionally in <abbr title="Extended Pascal">EP</abbr> <code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="n">readStr</span></code>/<code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="n">writeStr</span></code>).
</p><p>Nonetheless, <i>dialects</i> of Pascal implement mechanisms <i>resembling</i> variadic routines.
<a href="Delphi_(programming_language)" class="mw-redirect" title="Delphi (programming language)">Delphi</a> defines an <code class="mw-highlight mw-highlight-lang-delphi mw-content-ltr" style="" dir="ltr"><span class="k">array</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="k">const</span></code> data type that may be associated with the <i>last</i> <a href="Formal_parameter" class="mw-redirect" title="Formal parameter">formal parameter</a>.
Within the routine definition the <code class="mw-highlight mw-highlight-lang-delphi mw-content-ltr" style="" dir="ltr"><span class="k">array</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="k">const</span></code> is an <code class="mw-highlight mw-highlight-lang-delphi mw-content-ltr" style="" dir="ltr"><span class="k">array</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">TVarRec</span></code>, an <a href="Array_(data_type)" title="Array (data type)">array</a> of <a href="Variant_record" class="mw-redirect" title="Variant record">variant records</a>.<sup id="cite_ref-delphi_13-0" class="reference"><a href="#cite_note-delphi-13"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
The <code class="mw-highlight mw-highlight-lang-delphi mw-content-ltr" style="" dir="ltr"><span class="n">VType</span></code> member of the aforementioned <code class="mw-highlight mw-highlight-lang-delphi mw-content-ltr" style="" dir="ltr"><span class="k">record</span></code> data type allows inspection of the argument’s data type and subsequent appropriate handling.
The <a href="Free_Pascal_Compiler" class="mw-redirect" title="Free Pascal Compiler">Free Pascal Compiler</a> supports Delphi’s variadic routines, too.<sup id="cite_ref-fpc_14-0" class="reference"><a href="#cite_note-fpc-14"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>
</p><p>This implementation, however, technically requires a <i>single</i> argument, that is an <code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="k">array</span></code>.
Pascal imposes the restriction that arrays need to be homogenous.
This requirement is circumvented by utilizing a variant record.
The <a href="GNU_Pascal" title="GNU Pascal">GNU Pascal</a> defines a real variadic formal parameter specification using an ellipsis (<code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="o">...</span></code>), but as of 2022 no portable mechanism to use such has been defined.<sup id="cite_ref-gpc_15-0" class="reference"><a href="#cite_note-gpc-15"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup>
</p><p>Both GNU Pascal and FreePascal allow externally declared functions to use a variadic formal parameter specification using an ellipsis (<code class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" style="" dir="ltr"><span class="o">...</span></code>).
</p>
<div class="mw-heading mw-heading3"><h3 id="In_PHP">In PHP</h3></div>
<p><a href="PHP" title="PHP">PHP</a> does not care about types of variadic arguments unless the argument is typed.
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span class="k">function</span> <span class="nf">sum</span><span class="p">(</span><span class="o">...</span><span class="nv">$nums</span><span class="p">)</span><span class="o">:</span> <span class="nx">int</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">array_sum</span><span class="p">(</span><span class="nv">$nums</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">echo</span> <span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// 6</span>
</pre></div>
<p>And typed variadic arguments:
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span class="k">function</span> <span class="nf">sum</span><span class="p">(</span><span class="nx">int</span> <span class="o">...</span><span class="nv">$nums</span><span class="p">)</span><span class="o">:</span> <span class="nx">int</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">array_sum</span><span class="p">(</span><span class="nv">$nums</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">echo</span> <span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// TypeError: Argument 2 passed to sum() must be of the type int (since PHP 7.3)</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Python">In Python</h3></div>
<p><a href="Python_(programming_language)" title="Python (programming language)">Python</a> does not care about types of variadic arguments.
</p>
<div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="c1"># args is a tuple (immutable sequence).</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="c1"># ()</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="c1"># (3,)</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"hello"</span><span class="p">)</span> <span class="c1"># (3, "hello")</span>
</pre></div>
<p>Keyword arguments can be stored in a dictionary, e.g. <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">def bar(*args, **kwargs)</code>.
</p>
<div class="mw-heading mw-heading3"><h3 id="In_Raku">In Raku</h3></div>
<p>In <a href="Raku_(programming_language)" title="Raku (programming language)">Raku</a>, the type of parameters that create variadic functions are known as <i>slurpy</i> array parameters and they're classified into three groups:
</p>
<div class="mw-heading mw-heading4"><h4 id="Flattened_slurpy">Flattened slurpy</h4></div>
<p>These parameters are declared with a single asterisk (<code>*</code>) and they flatten arguments by dissolving one or more layers of elements that can be iterated over (i.e, <a rel="nofollow" class="external text" href="https://docs.perl6.org/type/Iterable">Iterables</a>).
</p>
<div class="mw-highlight mw-highlight-lang-perl6 mw-content-ltr" dir="ltr"><pre><span class="k">sub</span> <span class="n">foo</span>(<span class="nv">$a</span>, <span class="nv">$b</span>, *<span class="nv">@args</span>) {
<span class="nb">say</span> <span class="nv">@args</span>.<span class="nb">perl</span>;
}
<span class="n">foo</span>(<span class="mi">1</span>, <span class="mi">2</span>) <span class="c1"># []</span>
<span class="n">foo</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>) <span class="c1"># [3]</span>
<span class="n">foo</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, <span class="s">"hello"</span>) <span class="c1"># [3 "hello"]</span>
<span class="n">foo</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, [<span class="mi">4</span>, <span class="mi">5</span>], [<span class="mi">6</span>]); <span class="c1"># [3, 4, 5, 6]</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Unflattened_slurpy">Unflattened slurpy</h4></div>
<p>These parameters are declared with two asterisks (<code>**</code>) and they do not flatten any iterable arguments within the list, but keep the arguments more or less as-is:
</p>
<div class="mw-highlight mw-highlight-lang-perl6 mw-content-ltr" dir="ltr"><pre><span class="k">sub</span> <span class="n">bar</span>(<span class="nv">$a</span>, <span class="nv">$b</span>, **<span class="nv">@args</span>) {
<span class="nb">say</span> <span class="nv">@args</span>.<span class="nb">perl</span>;
}
<span class="n">bar</span>(<span class="mi">1</span>, <span class="mi">2</span>); <span class="c1"># []</span>
<span class="n">bar</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>); <span class="c1"># [3]</span>
<span class="n">bar</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, <span class="s">"hello"</span>); <span class="c1"># [3 "hello"]</span>
<span class="n">bar</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, [<span class="mi">4</span>, <span class="mi">5</span>], [<span class="mi">6</span>]); <span class="c1"># [3, [4, 5], [6]]</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Contextual_slurpy">Contextual slurpy</h4></div>
<p>These parameters are declared with a plus (<code>+</code>) sign and they apply the <i>"<a rel="nofollow" class="external text" href="https://docs.perl6.org/language/functions#Slurpy_conventions">single argument rule</a>"</i>, which decides how to handle the slurpy argument based upon context. Simply put, if only a single argument is passed and that argument is iterable, that argument is used to fill the slurpy parameter array. In any other case, <code>+@</code> works like <code>**@</code> (i.e., unflattened slurpy).
</p>
<div class="mw-highlight mw-highlight-lang-perl6 mw-content-ltr" dir="ltr"><pre><span class="k">sub</span> <span class="n">zaz</span>(<span class="nv">$a</span>, <span class="nv">$b</span>, +<span class="nv">@args</span>) {
<span class="nb">say</span> <span class="nv">@args</span>.<span class="nb">perl</span>;
}
<span class="n">zaz</span>(<span class="mi">1</span>, <span class="mi">2</span>); <span class="c1"># []</span>
<span class="n">zaz</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>); <span class="c1"># [3]</span>
<span class="n">zaz</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, <span class="s">"hello"</span>); <span class="c1"># [3 "hello"]</span>
<span class="n">zaz</span>(<span class="mi">1</span>, <span class="mi">2</span>, [<span class="mi">4</span>, <span class="mi">5</span>]); <span class="c1"># [4, 5], single argument fills up array</span>
<span class="n">zaz</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, [<span class="mi">4</span>, <span class="mi">5</span>]); <span class="c1"># [3, [4, 5]], behaving as **@</span>
<span class="n">zaz</span>(<span class="mi">1</span>, <span class="mi">2</span>, <span class="mi">3</span>, [<span class="mi">4</span>, <span class="mi">5</span>], [<span class="mi">6</span>]); <span class="c1"># [3, [4, 5], [6]], behaving as **@</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Ruby">In Ruby</h3></div>
<p><a href="Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a> does not care about types of variadic arguments.
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span class="k">def</span><span class="w"> </span><span class="nf">foo</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="w"> </span><span class="nb">print</span><span class="w"> </span><span class="n">args</span>
<span class="k">end</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># prints `[1]=> nil`</span>
<span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># prints `[1, 2]=> nil`</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Rust">In Rust</h3></div>
<p><a href="Rust_(programming_language)" title="Rust (programming language)">Rust</a> does not support variadic arguments in functions. Instead, it uses <a href="Macro_(computer_science)" title="Macro (computer science)">macros</a>.<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-rust mw-content-ltr" dir="ltr"><pre><span class="fm">macro_rules!</span><span class="w"> </span><span class="n">calculate</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// The pattern for a single `eval`</span>
<span class="w"> </span><span class="p">(</span><span class="n">eval</span><span class="w"> </span><span class="cp">$e</span><span class="p">:</span><span class="nc">expr</span><span class="p">)</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">{{</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="cp">$e</span><span class="p">;</span><span class="w"> </span><span class="c1">// Force types to be integers</span>
<span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"{} = {}"</span><span class="p">,</span><span class="w"> </span><span class="fm">stringify!</span><span class="p">{</span><span class="cp">$e</span><span class="p">},</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}};</span>
<span class="w"> </span><span class="c1">// Decompose multiple `eval`s recursively</span>
<span class="w"> </span><span class="p">(</span><span class="n">eval</span><span class="w"> </span><span class="cp">$e</span><span class="p">:</span><span class="nc">expr</span><span class="p">,</span><span class="w"> </span><span class="cp">$(</span><span class="n">eval</span><span class="w"> </span><span class="cp">$es</span><span class="p">:</span><span class="nc">expr</span><span class="p">),</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">{{</span>
<span class="w"> </span><span class="n">calculate</span><span class="o">!</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">eval</span><span class="w"> </span><span class="cp">$e</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">calculate</span><span class="o">!</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cp">$(</span><span class="n">eval</span><span class="w"> </span><span class="cp">$es</span><span class="p">),</span><span class="o">+</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}};</span>
<span class="p">}</span>
<span class="k">fn</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">calculate</span><span class="o">!</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// Look ma! Variadic `calculate!`!</span>
<span class="w"> </span><span class="n">eval</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<span class="w"> </span><span class="n">eval</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
<span class="w"> </span><span class="n">eval</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Rust is able to interact with C's variadic system via a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">c_variadic</code> feature switch. As with other C interfaces, the system is considered <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">unsafe</code> to Rust.<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="In_Scala">In Scala</h3></div>
<div class="mw-highlight mw-highlight-lang-scala mw-content-ltr" dir="ltr"><pre><span class="k">object</span><span class="w"> </span><span class="nc">Program</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Variadic methods store any additional arguments they receive in an array.</span>
<span class="w"> </span><span class="c1">// Consequentially, `printArgs` is actually a method with one parameter: a</span>
<span class="w"> </span><span class="c1">// variable-length array of `String`s.</span>
<span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">printArgs</span><span class="p">(</span><span class="n">strings</span><span class="p">:</span><span class="w"> </span><span class="nc">String</span><span class="o">*</span><span class="p">):</span><span class="w"> </span><span class="nc">Unit</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">strings</span><span class="p">.</span><span class="n">foreach</span><span class="p">(</span><span class="n">println</span><span class="p">)</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">:</span><span class="w"> </span><span class="nc">Array</span><span class="p">[</span><span class="nc">String</span><span class="p">]):</span><span class="w"> </span><span class="nc">Unit</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">printArgs</span><span class="p">(</span><span class="s">"hello"</span><span class="p">);</span><span class="w"> </span><span class="c1">// short for printArgs(["hello"])</span>
<span class="w"> </span><span class="n">printArgs</span><span class="p">(</span><span class="s">"hello"</span><span class="p">,</span><span class="w"> </span><span class="s">"world"</span><span class="p">);</span><span class="w"> </span><span class="c1">// short for printArgs(["hello", "world"])</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Swift">In Swift</h3></div>
<p><a href="Swift_(programming_language)" title="Swift (programming language)">Swift</a> cares about the type of variadic arguments, but the catch-all <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">Any</code> type is available.
</p>
<div class="mw-highlight mw-highlight-lang-swift mw-content-ltr" dir="ltr"><pre><span class="kd">func</span><span class="w"> </span><span class="nf">greet</span><span class="p">(</span><span class="n">timeOfTheDay</span><span class="p">:</span><span class="w"> </span><span class="nb">String</span><span class="p">,</span><span class="w"> </span><span class="n">names</span><span class="p">:</span><span class="w"> </span><span class="nb">String</span><span class="p">...)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// here, names is [String]</span>
<span class="w"> </span>
<span class="w"> </span><span class="bp">print</span><span class="p">(</span><span class="s">"Looks like we have </span><span class="si">\(</span><span class="n">names</span><span class="p">.</span><span class="bp">count</span><span class="si">)</span><span class="s"> people"</span><span class="p">)</span>
<span class="w"> </span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">names</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="bp">print</span><span class="p">(</span><span class="s">"Hello </span><span class="si">\(</span><span class="n">name</span><span class="si">)</span><span class="s">, good </span><span class="si">\(</span><span class="n">timeOfTheDay</span><span class="si">)</span><span class="s">"</span><span class="p">)</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="n">greet</span><span class="p">(</span><span class="n">timeOfTheDay</span><span class="p">:</span><span class="w"> </span><span class="s">"morning"</span><span class="p">,</span><span class="w"> </span><span class="n">names</span><span class="p">:</span><span class="w"> </span><span class="s">"Joseph"</span><span class="p">,</span><span class="w"> </span><span class="s">"Clara"</span><span class="p">,</span><span class="w"> </span><span class="s">"William"</span><span class="p">,</span><span class="w"> </span><span class="s">"Maria"</span><span class="p">)</span>
<span class="c1">// Output:</span>
<span class="c1">// Looks like we have 4 people</span>
<span class="c1">// Hello Joseph, good morning</span>
<span class="c1">// Hello Clara, good morning</span>
<span class="c1">// Hello William, good morning</span>
<span class="c1">// Hello Maria, good morning</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="In_Tcl">In Tcl</h3></div>
<p>A <a href="Tcl" title="Tcl">Tcl</a> procedure or lambda is variadic when its last argument is <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">args</code>: this will contain a list (possibly empty) of all the remaining arguments. This pattern is common in many other procedure-like methods.<sup id="cite_ref-18" class="reference"><a href="#cite_note-18"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-19" class="reference"><a href="#cite_note-19"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-tcl mw-content-ltr" dir="ltr"><pre><span class="k">proc</span><span class="w"> </span>greet<span class="w"> </span><span class="k">{</span><span class="nv">timeOfTheDay</span><span class="w"> </span>args<span class="k">}</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Looks like we have [llength $args] people"</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span>name<span class="w"> </span><span class="nv">$args</span><span class="w"> </span><span class="k">{</span>
<span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Hello $name, good $timeOfTheDay"</span>
<span class="w"> </span><span class="k">}</span>
<span class="k">}</span>
<span class="nv">greet</span><span class="w"> </span><span class="s2">"morning"</span><span class="w"> </span><span class="s2">"Joseph"</span><span class="w"> </span><span class="s2">"Clara"</span><span class="w"> </span><span class="s2">"William"</span><span class="w"> </span><span class="s2">"Maria"</span>
<span class="c"># Output:</span>
<span class="c"># Looks like we have 4 people</span>
<span class="c"># Hello Joseph, good morning</span>
<span class="c"># Hello Clara, good morning</span>
<span class="c"># Hello William, good morning</span>
<span class="c"># Hello Maria, good morning</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Java_syntax#Varargs" title="Java syntax">Varargs in Java programming language</a></li>
<li><a href="Variadic_macro" class="mw-redirect" title="Variadic macro">Variadic macro</a> (C programming language)</li>
<li><a href="Variadic_template" title="Variadic template">Variadic template</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Notes">Notes</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-KandR-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-KandR_6-0">^</a></b></span> <span class="reference-text">Making the named parameter optional was needed since there was no way to specify a function taking an unspecified number of arguments in C23 after the removal of K&R style function definitions. Since C++ was already using this syntax for the same purpose, this change was also a way to increase compatibility between the languages.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text">Henry S. Leonard and H. N. Goodman, <i>A calculus of individuals</i>. Abstract of a talk given at the Second Meeting of the Association for Symbolic Logic, held in Cambridge MA on December 28–30, 1936, <a rel="nofollow" class="external autonumber" href="https://www.jstor.org/stable/2268861">[1]</a>, <i>Journal of Symbolic Logic</i> <b>2</b>(1) 1937, 63.</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFKlemens2014" class="citation book cs1">Klemens, Ben (2014). <i>21st Century C: C Tips from the New School</i>. O'Reilly Media, Inc. p. 224. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <bdi>978-1491904442</bdi>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://arxiv.org/abs/1503.00336">CLP (H): Constraint Logic Programming for Hedges</a></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20121031160547/http://www.cplusplus.com/reference/clibrary/cstdarg/">"<cstdarg> (stdarg.h) - C++ Reference"</a>. <i>www.cplusplus.com</i>. Archived from <a rel="nofollow" class="external text" href="http://www.cplusplus.com/reference/clibrary/cstdarg/">the original</a> on 2012-10-31<span class="reference-accessdate">. Retrieved <span class="nowrap">2007-10-02</span></span>.</cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://thephd.dev/c23-is-coming-here-is-what-is-on-the-menu#n2975---relax-requirements-for-variadic-parameter-lists">"C23 is Finished: Here is What is on the Menu §N2975 - Relax requirements for variadic parameter lists"</a>. 31 July 2022.</cite></span>
</li>
<li id="cite_note-N2975-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-N2975_7-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFGildingMeneide2022" class="citation web cs1">Gilding, Alex; Meneide, JeanHeyd (2022-04-15). <a rel="nofollow" class="external text" href="https://open-std.org/JTC1/SC22/WG14/www/docs/n2975.pdf">"WG14-N2975 : Relax requirements for variadic parameter lists, v3"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://wiki.sei.cmu.edu/confluence/display/cplusplus/DCL50-CPP">"DCL50-CPP. Do not define a C-style variadic function"</a>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.intel.com/content/www/us/en/docs/fortran-compiler/developer-guide-reference/2023-0/optional-arguments.html">"Optional Arguments"</a>. <i>Intel</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2025-03-18</span></span>.</cite></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://gobyexample.com/variadic-functions">"Go by Example: Variadic Functions"</a>.</cite></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.lua.org/manual/5.2/manual.html#pdf-table.unpack">"Lua 5.2 Reference Manual"</a>. <i>www.lua.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2023-02-05</span></span>.</cite></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.lua.org/manual/5.1/manual.html#pdf-unpack">"Lua 5.1 Reference Manual"</a>. <i>www.lua.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2023-02-05</span></span>.</cite></span>
</li>
<li id="cite_note-delphi-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-delphi_13-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Parameters_(Delphi)#Variant_Open_Array_Parameters">"Parameters (Delphi)"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2023-08-28</span></span>.</cite></span>
</li>
<li id="cite_note-fpc-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-fpc_14-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.freepascal.org/docs-html/3.2.0/ref/refsu68.html">"Free Pascal - Reference guide"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2023-08-28</span></span>.</cite></span>
</li>
<li id="cite_note-gpc-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-gpc_15-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.gnu-pascal.de/gpc/Special-Parameters.html">"The GNU Pascal Manual"</a><span class="reference-accessdate">. Retrieved <span class="nowrap">2023-08-28</span></span>.</cite></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://doc.rust-lang.org/rust-by-example/macros/variadics.html">"Variadics"</a>. <i>Rust By Example</i>.</cite></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://rust-lang.github.io/rfcs/2137-variadic.html">"2137-variadic"</a>. <i>The Rust RFC Book</i>.</cite></span>
</li>
<li id="cite_note-18"><span class="mw-cite-backlink"><b><a href="#cite_ref-18">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.tcl.tk/man/tcl/TclCmd/proc.html">"proc manual page"</a>. <i>Tcl/Tk Documentation</i>.</cite></span>
</li>
<li id="cite_note-19"><span class="mw-cite-backlink"><b><a href="#cite_ref-19">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://wiki.tcl-lang.org/page/args">"args"</a>. <i>Tcler's Wiki</i>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://rosettacode.org/wiki/Variadic_function">Variadic function</a>. <a href="Rosetta_Code" title="Rosetta Code">Rosetta Code</a> task showing the implementation of variadic functions in over 120 programming languages.</li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20070927215504/http://www.codeproject.com/cpp/argfunctions.asp?df=100&forumid=15556&exp=0&select=503481">Variable Argument Functions</a> — A tutorial on Variable Argument Functions for C++</li>
<li><a rel="nofollow" class="external text" href="https://www.gnu.org/software/hello/manual/libc/Variadic-Functions.html">GNU libc manual</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-07-25" href="https://en.wikipedia.org/wiki/?title=Variadic_function&oldid=1302442431">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>